<?php
namespace app\service;

use app\validate\User;
use Couchbase\ViewException;
use think\facade\Db;

class UserService
{
    public function userList($info)
    {
        $result = array();
//        $list = Db::table('csc_user')->where('csc_id','in',function ($query){
//            $query->table('csc_user_expend_one')->where('buy_province_id','510000')->field('csc_user_id');
//        })->field('csc_id,csc_company')->paginate(10);
//        var_dump($list);exit();
//        $result = Db::name('user')->where('csc_shen',1)->column('*','csc_id');
        $list = Db::name('user')->where('csc_shen',$info['csc_shen'])->order('csc_reg_time','desc')->paginate(10);
        $page = $list->render();
        $total = $list->total();
        if($list->isEmpty()){
            echo '数据集为空';
        }
        $result['list'] = $list;
        $result['page'] = $page;
        $result['total'] = $total;
        return $result;
    }

    public function userListByPage($info)
    {
        $result = array();
//        $list = Db::name('user')->where('csc_shen',$info['csc_shen'])->order('csc_reg_time','desc')->paginate([
//            'list_rows'=> $info['list_rows'],
//        ]);
//        $list = Db::name('user')->where('csc_shen',$info['csc_shen'])->field('csc_id,csc_user,csc_phone,csc_company')->paginateX(20);//查询某些字段
//        $list = Db::name('user')->order('csc_reg_time','desc')->value('csc_user');//取第一个数据的csc_user字段内容
//        $list = Db::name('user')->order('csc_reg_time','desc')->column('csc_user');//取所有数据的csc_user字段的内容
//        $list = Db::name('user')->order('csc_reg_time','desc')->column('*','csc_id');//取所有数据,以csc_id 为索引
//        $cursor = Db::name('user')->where('csc_shen',$info['csc_shen'])->order('csc_reg_time','desc')->cursor();
//        foreach($cursor as $user){
//            echo $user['csc_reg_time'];
//        }
//        exit();
//        var_dump($list['csc_name']);exit();
//        $list = Db::name('user')->where('csc_shen',$info['csc_shen'])->limit(10)->select()->toArray();

        //whereIn  whereNoIn  whereBetween  whereNotBetween  whereNull whereNotNull
        //whereExp表达式  后面可以跟任何sql语句或者函数
        //->order(['order','id'=>'desc'])支持多个字段排序  ->orderRaw("field(name,'thinkphp','onethink','kancloud')")如果你需要在order方法中使用mysql函数的话
        //whereYear 查询今年注册的用户  whereMonth 查询本月注册用户  whereWeek查询本周注册用户  whereDay查询当天注册的用户
        // 查询有效期内的活动
//        Db::name('event')->whereBetweenTimeField('start_time', 'end_time')->select();
//        在多个字段之间用|分割表示OR查询，用&分割表示AND查询
//        Db::table('think_user')->where('name|title','like','thinkphp%')->where('create_time&update_time','>',0)->find();
//        两个字段比较的查询条件whereColumn方法的用法。查询update_time大于create_time的用户数据
//        Db::table('think_user')->whereColumn('update_time','>','create_time')->select();
        $list = Db::name('user')->alias('a')->join('csc_user_expend_one b','a.csc_id=b.csc_user_id')->where('a.csc_shen',$info['csc_shen'])->wherelike('a.csc_company','%药店%')->whereExp('a.csc_isdel','in (0)')->whereYear('csc_reg_time')->order('a.csc_reg_time','asc')->field('a.*,b.csc_buy_tag')->paginate(10);
//多表查询
        //        Db::table('think_user')
//            ->whereRaw("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp'])
//            ->select();//使用字符串条件的时候，如果需要传入变量，建议配合预处理机制，确保更加安全
//        Db::table('user')->fieldRaw('id,SUM(score)')->select();//可以在fieldRaw方法中直接使用函数
        //Db::table('user')->field(true)->select();//field(true)的用法会显式的获取数据表的所有字段列表
//        Db::table('article')->limit(25)->page(3)->select();和Db::table('article')->page(3,25)->select();意思是一样的，表示第3页显示25个数据

        $shen_state = [
            0=>'待审核',
            1=>'审核通过',
            2=>'已注销'
        ];
        $lock = [
            0=>'未锁定',
            1=>'已锁'
        ];
        $type = [
            '1' =>'诊所',
            '2' =>'药店',
            '3' =>'卫生站',
            '4' =>'药房',
            '5' =>'连锁公司',
            '6' =>'医院',
            '7' =>'原批发公司',
            '8' =>'原商业公司'
        ];
//        $data = Db::name('user')->where('csc_shen','<',2)->paginate()->each(function ($item,$key){
//            if($item['csc_shen']==0){
//                $item['csc_shen_state'] = '待审核';
//            }elseif($item['csc_shen']==1){
//                $item['csc_shen_state'] = '审核通过';
//            }elseif($item['csc_shen']==2){
//                $item['csc_shen_state'] = '已注销';
//            }
//            return $item;
//        });//自主加字段
//        var_dump($data);exit();
        $data = $list->items();
        $data = array_map(function($item) use($shen_state,$lock,$type){
            if(isset($item['csc_shen']) && isset($shen_state[$item['csc_shen']])){
                $item['csc_shen'] = $shen_state[$item['csc_shen']];
            }
            if(isset($item['csc_lock'])&&isset($lock[$item['csc_lock']])){
                $item['csc_lock'] = $lock[$item['csc_lock']];
            }
            if(isset($item['csc_type'])&&isset($type[$item['csc_type']])){
                $item['csc_type'] = $type[$item['csc_type']];
            }
            return $item;
        },$data);
        $page = $list->render();
        $result['list'] = $data;
        $result['page'] = $page;
        return $result;
    }
    public function getUserById($id)
    {
        $data = \think\facade\Cache::get('user_'.$id);//获取缓存数据
//        var_dump($data);exit();
        //表示对查询结果的缓存有效期60秒  cache和cachealways的区别 如果本次查询数据为空,那么cache不会缓存,而cacheAlways会把这次空数据缓存下来,下次查询的时候会直接返回空数据
//        Db::table('user')->cacheAlways('key',60,'tagName')->where('username','think')->find();
        $result = Db::name('user')->where('csc_id', $id)->withoutField('csc_reg_ip')->cache('user_'.$id,60)->findOrFail();//withoutField('content,reg_time')不显示哪些字段
//        echo Db::table('user')->fetchSql(true)->find($id);exit();//fetchSql用于直接返回SQL而不是执行查询，适用于任何的CURD操作方法
//        $result = Db::table('csc_user')->max('csc_score');//取最大积分的值 avg('score');获取平均值 sum总值  min 最小值  count数量
        //如果要用group 则需要自己写sql
//        $result = Db::table('csc_user')->field('csc_pid,SUM(csc_score) AS sum_score')->where('csc_score','>',0)->group('csc_pid')->select();
        var_dump($result);exit();
        return $result;
    }

    public function editUser($data)
    {
        $validate = new User();
        try {
            $validate->scene('edituser')->check($data);
        }catch (ViewException $e){
            // 验证失败 输出错误信息
            dump($e->getError());
        }
//        $result = Db::name('user')->save($data); 或者$result = Db::name('user')->update($data);$data中包含主键csc_id
//        或
        $result = Db::name('user')->where('csc_id', $data['csc_id'])->save($data);
        return $result;
    }

    public function addUser($data)
    {
        //方法1
//        try {
//            validate(User::class)->check([
//                'csc_user'  => $data['csc_user'],
//                'csc_phone' => $data['csc_phone'],
//                'csc_company' => $data['csc_company'],
//                'csc_pwd' => $data['csc_pwd'],
//            ]);
//        } catch (ValidateException $e) {
//            // 验证失败 输出错误信息
//            dump($e->getError());
//        }
        //方法2
        $validate = new User();
        $check_result = $validate->check($data);
//        var_dump($check_result);
        if(!$check_result){
            echo $validate->getError();
        }else{
//            echo 'ww';
            $result = Db::name('user')->save($data);//自动判断是新增还是更新数据（以写入数据中是否存在主键数据为依据）。
//            $result = Db::name('user')->insertGetId($data);//新增数据并返回主键值
            //Db::name('user')->replace()->insertAll($data);//添加数据成功返回添加成功的条数
            // 关闭字段严格检查，可以针对某张表控制字段是否严查
//            Db::name('user')->strict(false)->insert($data);

//            Db::table('user')->limit(100)->insertAll($userList);//如果用于insertAll方法的话，则可以分批多次写入，每次最多写入limit方法指定的数量。
//            Db::name('user')->extra('IGNORE')->insert(['name' => 'think']);//插入不重复的数据
//            Db::name('user')->duplicate(['nickname', 'email'])->insertAll($data);//这段代码会尝试插入数据，如果nickname或email重复，则更新现有记录
            return $result;
        }
    }

    public function deletedUser($id)
    {
//        $result = Db::name('user')->where('csc_id', $id)->delete();
//        $result = Db::name('user')->where('csc_id', $id)->delete([1,2,3]);//相当于in(1,2,3)
        //Db::name('user')->delete(true);删除所有数据（不带任何筛选条件）
        // 软删除数据 使用delete_time字段标记删除
        $result = Db::name('user')
            ->where('csc_id', $id)
            ->useSoftDelete('csc_isdel',1)
            ->delete();//useSoftDelete方法表示使用软删除，并且指定软删除字段为delete_time，写入数据为当前的时间戳。
        return $result;
    }


    public function getStatistics($info)
    {
        $datasql = Db::table('csc_user')->field('csc_pid,count(csc_id) as son')->whereNotNull('csc_pid')->whereIn('csc_shen','0,1')->group('csc_pid')->buildSql();
        $list = Db::table('csc_login')->alias('a')->join([$datasql=>'g'],'a.csc_id=g.csc_pid')->field('a.csc_id,a.csc_user,g.son')->page(1,10)->select();
        $result['list'] = $list;
        return $result;
    }
}

